﻿package com.taihua_tech.basic.aspect;

import java.util.Arrays;
import java.util.List;

import org.apache.log4j.Logger;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.stereotype.Component;

//封装共同处理的组件
@Component//扫描,等价于<bean>定义
@Aspect//等价于<aop:aspect ref="">
public class LoggerBean {

	private static Logger logger = Logger.getLogger(LoggerBean.class);
	//要在Controller.execute开始位置切入
	//方法规则:public void 方法名(){...} （前置通知）
	@Before("within(com.taihua_tech.basic.*.controller..*) and within(com.taihua_tech.basic.*.controller..*) ")
	//等价于<aop:before method="logController" pointcut="">
	public void logController(JoinPoint joinpoint){
		logger.info("-----------进入 Controller 组件处理-------------");
		logger.info("返回值类型  请求方法 请求参数类型 ："+joinpoint.getSignature());
		logger.info("目标控制器："+joinpoint.getSignature().getDeclaringType());
		String methodName = joinpoint.getSignature().getName();
		List<Object> args = Arrays.asList(joinpoint.getArgs());
		logger.info("访问方法： " + methodName + " 请求参数： " + args);
	}
	
	 //后置通知：在目标方法执行后（无论是否发生异常），执行的通知
    //在后置通知中，还不能访问目标方法执行的结果
    @After("within(com.taihua_tech.basic.*.controller..*) and within(com.taihua_tech.basic.*.controller..*) ")
    public void afterMethod(JoinPoint joinPoint) {
		logger.info("控制器方法执行完毕："+joinPoint.getSignature()); 
		String methodName = joinPoint.getSignature().getName();
		List<Object> args = Arrays.asList(joinPoint.getArgs());
		logger.info("访问方法： " + methodName + " 参数： " + args);
        logger.info("-----------离开 Controller 组件处理-------------");
    }
	
}
